//
//  AppDelegate.swift
//  微校园
//
//  Created by Gao on 16/12/12.
//  Copyright © 2016年 weSchool. All rights reserved.
//

import UIKit
import UserNotifications
import SVProgressHUD
import AFNetworking

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, RCIMConnectionStatusDelegate, RCIMUserInfoDataSource, RCIMGroupInfoDataSource, RCIMReceiveMessageDelegate {


    
    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        
        Bugly.start(withAppId: "6563ff1b9f") //老高的帐号注册的
        //初始化融云SDK，在使用SDK的所有功能和显示相关View(包括继承于SDK的View)之前必须先初始化
        RCIM.shared().initWithAppKey(WSRongAppKey)
        //设置监听连接状态
        RCIM.shared().connectionStatusDelegate = self
        //设置消息接收的监听
        RCIM.shared().receiveMessageDelegate = self
        
        //设置用户信息提供者，需要提供正确的用户信息，否则SDK无法显示用户头像、用户名和本地通知
        RCIM.shared().userInfoDataSource = self
        //设置群组信息提供者，需要提供正确的群组信息，否则SDK无法显示群组头像、群名称和本地通知
        RCIM.shared().groupInfoDataSource = self
        //推送处理1
        if #available(iOS 8.0, *) {
            //注册推送,用于iOS8以上系统
            application.registerUserNotificationSettings(
                UIUserNotificationSettings(types:[.alert, .badge, .sound], categories: nil))
        } else {
            //注册推送,用于iOS8以下系统
            application.registerForRemoteNotifications(matching: [.badge, .alert, .sound])
        }
        
        // 示例
//        //点击远程推送的launchOptions内容格式请参考官网文档
//        //http://www.rongcloud.cn/docs/ios.html#App_接收的消息推送格式
//        
//        let viewController = ViewController()
//        let nav = UINavigationController(rootViewController: viewController)
//        self.window?.rootViewController = nav
//        self.window?.backgroundColor = UIColor.yellow
//        self.window?.makeKeyAndVisible()
//        

        
        
        // 应用程序额外设置
        setupAdditions()
        
        window = UIWindow()
        window?.backgroundColor = UIColor.white
        
//        window?.rootViewController = WSMainViewController()
        window?.rootViewController = WSLoginViewController()
        
        
        
        window?.makeKeyAndVisible()
        
        loadAppInfo()
        
        return true
    }
    
    //推送处理2
    @available(iOS 8.0, *)
    func application(_ application: UIApplication, didRegister notificationSettings: UIUserNotificationSettings) {
        //注册推送,用于iOS8以上系统
        application.registerForRemoteNotifications()
    }
    
    //推送处理3
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        var rcDevicetoken = deviceToken.description
        rcDevicetoken = rcDevicetoken.replacingOccurrences(of: "<", with: "")
        rcDevicetoken = rcDevicetoken.replacingOccurrences(of: ">", with: "")
        rcDevicetoken = rcDevicetoken.replacingOccurrences(of: " ", with: "")
        
        RCIMClient.shared().setDeviceToken(rcDevicetoken)
    }
    
    //推送处理4
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
        //远程推送的userInfo内容格式请参考官网文档
        //http://www.rongcloud.cn/docs/ios.html#App_接收的消息推送格式
    }
    
    func application(_ application: UIApplication, didReceive notification: UILocalNotification) {
        //本地通知
    }
    
    //监听连接状态变化
    func onRCIMConnectionStatusChanged(_ status: RCConnectionStatus) {
        print("RCConnectionStatus = \(status.rawValue)")
    }
    
    //用户信息提供者。您需要在completion中返回userId对应的用户信息，SDK将根据您提供的信息显示头像和用户名
    func getUserInfo(withUserId userId: String!, completion: ((RCUserInfo?) -> Void)!) {
        print("用户信息提供者，getUserInfoWithUserId:\(userId)")
        
        //简单的示例，根据userId获取对应的用户信息并返回
        //建议您在本地做一个缓存，只有缓存没有该用户信息的情况下，才去您的服务器获取，以提高用户体验
        if (userId == "me") {
            //如果您提供的头像地址是http连接，在iOS9以上的系统中，请设置使用http，否则无法正常显示
            //具体可以参考Info.plist中"App Transport Security Settings->Allow Arbitrary Loads"
            completion(RCUserInfo(userId: userId, name: "我的名字", portrait: "http://www.rongcloud.cn/images/newVersion/logo/baixing.png"))
        } else if (userId == "you") {
            completion(RCUserInfo(userId: userId, name: "你的名字", portrait: "http://www.rongcloud.cn/images/newVersion/logo/qichezc.png"))
        } else {
            completion(RCUserInfo(userId: userId, name: "unknown", portrait: "http://www.rongcloud.cn/images/newVersion/logo/douguo.png"))
        }
    }
    
    //群组信息提供者。您需要在Block中返回groupId对应的群组信息，SDK将根据您提供的信息显示头像和群组名
    func getGroupInfo(withGroupId groupId: String!, completion: ((RCGroup?) -> Void)!) {
        print("群组信息提供者，getGroupInfoWithGroupId:\(groupId)")
        
        //简单的示例，根据groupId获取对应的群组信息并返回
        //建议您在本地做一个缓存，只有缓存没有该群组信息的情况下，才去您的服务器获取，以提高用户体验
        if (groupId == "group01") {
            //如果您提供的头像地址是http连接，在iOS9以上的系统中，请设置使用http，否则无法正常显示
            //具体可以参考Info.plist中"App Transport Security Settings->Allow Arbitrary Loads"
            completion(RCGroup(groupId: groupId, groupName: "第一个群", portraitUri: "http://www.rongcloud.cn/images/newVersion/logo/aipai.png"))
        } else {
            completion(RCGroup(groupId: groupId, groupName: "unknown", portraitUri: "http://www.rongcloud.cn/images/newVersion/logo/qiugongl.png"))
        }
    }
    
    //监听消息接收
    func onRCIMReceive(_ message: RCMessage!, left: Int32) {
        if (left != 0) {
            print("收到一条消息，当前的接收队列中还剩余\(left)条消息未接收，您可以等待left为0时再刷新UI以提高性能")
        } else {
            print("收到一条消息")
        }
    }
    
}

fileprivate extension AppDelegate {
    
    // MARK: - 设置应用程序额外信息
    func setupAdditions() {
        // 1. 设置 SVProguressHUD 最小解除时间
        SVProgressHUD.setMinimumDismissTimeInterval(1)
        
        // 2. 设置网络加载指示器
        AFNetworkActivityIndicatorManager.shared().isEnabled = true
        
        // 3. 设置用户授权显示通知
        // #available 是检测设备版本，如果是 10.0 以上
        if #available(iOS 10.0, *) {
            UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .carPlay, .sound]) { (success, error) in
//                print("授权 " + (success ? "成功" : "失败"))
            }
        } else {
            // 10.0 以下
            // 取得用户授权显示通知[上方的提示条/声音/BadgeNumber]
            let notifySettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
            
            UIApplication.shared.registerUserNotificationSettings(notifySettings)
        }
    }
    
    // MARK: - 从服务器加载应用程序信息
    func loadAppInfo() {
        // 1. 模拟异步
        DispatchQueue.global().async {
            
            // 1> FIXME: url
            let url = Bundle.main.url(forResource: "main.json", withExtension: nil)
            
            // 2> data
            let data = NSData(contentsOf: url!)
            
            // 3> 写入磁盘
            let docDir = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
            let jsonPath = (docDir as NSString).appendingPathComponent("main.json")
            
            // 直接保存在沙盒，等待下一次程序启动使用！
            data?.write(toFile: jsonPath, atomically: true)
            
//            print("应用程序加载完毕 \(jsonPath)")
        }
    }
}
